home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
DJGPP
/
CBGRX103.ZIP
/
contrib
/
libgrx
/
src
/
reg8514a.h
< prev
next >
Wrap
Text File
|
1993-12-06
|
9KB
|
366 lines
/*
REG8514.H
Written by Jake Richter
Copyright (c) 1989,1990 Panacea Inc., Londonderry, NH - All Rights Reserved
This code may be freely incorporated in any program without
royalty, as long as the copyright notice stays intact.
This include file contains the standard definitions necessary for
programming the IBM 8514/A.
The following definitions are used in all the listings to reference
certain data types. This is done to help make the code more readable,
and to assist later translation and communication with assembly language.
*/
/*
VESA Approved Register Definitions
*/
#define DAC_MASK 0x02EA
#define DAC_R_INDEX 0x02EB
#define DAC_W_INDEX 0x02EC
#define DAC_DATA 0x02ED
#define DISP_STAT 0x02E8
#define H_TOTAL 0x02E8
#define H_DISP 0x06E8
#define H_SYNC_STRT 0x0AE8
#define H_SYNC_WID 0x0EE8
#define V_TOTAL 0x12E8
#define V_DISP 0x16E8
#define V_SYNC_STRT 0x1AE8
#define V_SYNC_WID 0x1EE8
#define DISP_CNTL 0x22E8
#define ADVFUNC_CNTL 0x4AE8
#define SUBSYS_STAT 0x42E8
#define SUBSYS_CNTL 0x42E8
#define ROM_PAGE_SEL 0x46E8
#define CUR_Y 0x82E8
#define CUR_X 0x86E8
#define DESTY_AXSTP 0x8AE8
#define DESTX_DIASTP 0x8EE8
#define ERR_TERM 0x92E8
#define MAJ_AXIS_PCNT 0x96E8
#define GP_STAT 0x9AE8
#define CMD 0x9AE8
#define SHORT_STROKE 0x9EE8
#define BKGD_COLOR 0xA2E8
#define FRGD_COLOR 0xA6E8
#define WRT_MASK 0xAAE8
#define RD_MASK 0xAEE8
#define COLOR_CMP 0xB2E8
#define BKGD_MIX 0xB6E8
#define FRGD_MIX 0xBAE8
#define MULTIFUNC_CNTL 0xBEE8
#define MIN_AXIS_PCNT 0x0000
#define SCISSORS_T 0x1000
#define SCISSORS_L 0x2000
#define SCISSORS_B 0x3000
#define SCISSORS_R 0x4000
#define MEM_CNTL 0x5000
#define PATTERN_L 0x8000
#define PATTERN_H 0x9000
#define PIX_CNTL 0xA000
#define PIX_TRANS 0xE2E8
/* Display Status Bit Fields */
#define HORTOG 0x0004
#define VBLANK 0x0002
#define SENSE 0x0001
/* Horizontal Sync Width Bit Field */
#define HSYNCPOL_NEG 0x0020
#define HSYNCPOL_POS 0x0000
/* Vertical Sync Width Bit Field */
#define VSYNCPOL_NEG 0x0020
#define VSYNCPOL_POS 0x0000
/* Display Control Bit Field */
#define DISPEN_NC 0x0000
#define DISPEN_DISAB 0x0040
#define DISPEN_ENAB 0x0020
#define INTERLACE 0x0010
#define DBLSCAN 0x0008
#define MEMCFG_2 0x0000
#define MEMCFG_4 0x0002
#define MEMCFG_6 0x0004
#define MEMCFG_8 0x0006
#define ODDBNKENAB 0x0001
/* Subsystem Status Register */
#define _8PLANE 0x0080
#define MONITORID_8503 0x0050
#define MONITORID_8507 0x0010
#define MONITORID_8512 0x0060
#define MONITORID_8513 0x0060
#define MONITORID_8514 0x0020
#define MONITORID_NONE 0x0070
#define MONITORID_MASK 0x0070
#define GPIDLE 0x0008
#define INVALIDIO 0x0004
#define PICKFLAG 0x0002
#define VBLNKFLG 0x0001
/* Subsystem Control Register */
#define GPCTRL_NC 0x0000
#define GPCTRL_ENAB 0x4000
#define GPCTRL_RESET 0x8000
#define CHPTEST_NC 0x0000
#define CHPTEST_NORMAL 0x1000
#define CHPTEST_ENAB 0x2000
#define IGPIDLE 0x0800
#define IINVALIDIO 0x0400
#define IPICKFLAG 0x0200
#define IVBLNKFLG 0x0100
#define RGPIDLE 0x0008
#define RINVALIDIO 0x0004
#define RPICKFLAG 0x0002
#define RVBLNKFLG 0x0001
/* Current X, Y & Dest X, Y Mask */
#define COORD_MASK 0x07FF
/* Advanced Function Control Register */
#define CLKSEL 0x0004
#define DISABPASSTHRU 0x0001
/* Graphics Processor Status Register */
#define GPBUSY 0x0200
#define DATARDY 0x0100
/* Command Register */
#define CMD_NOP 0x0000
#define CMD_LINE 0x2000
#define CMD_RECT 0x4000
#define CMD_RECTV1 0x6000
#define CMD_RECTV2 0x8000
#define CMD_LINEAF 0xA000
#define CMD_BITBLT 0xC000
#define CMD_OP_MSK 0xF000
#define BYTSEQ 0x1000
#define _16BIT 0x0200
#define PCDATA 0x0100
#define INC_Y 0x0080
#define YMAJAXIS 0x0040
#define INC_X 0x0020
#define DRAW 0x0010
#define LINETYPE 0x0008
#define LASTPIX 0x0004
#define PLANAR 0x0002
#define WRTDATA 0x0001
/*
Short Stroke Vector Transfer Register
(The angular defs also apply to the Command Register)
*/
#define VECDIR_000 0x0000
#define VECDIR_045 0x0020
#define VECDIR_090 0x0040
#define VECDIR_135 0x0060
#define VECDIR_180 0x0080
#define VECDIR_225 0x00A0
#define VECDIR_270 0x00C0
#define VECDIR_315 0x00E0
#define SSVDRAW 0x0010
/* Background Mix Register */
#define BSS_BKGDCOL 0x0000
#define BSS_FRGDCOL 0x0020
#define BSS_PCDATA 0x0040
#define BSS_BITBLT 0x0060
/* Foreground Mix Register */
#define FSS_BKGDCOL 0x0000
#define FSS_FRGDCOL 0x0020
#define FSS_PCDATA 0x0040
#define FSS_BITBLT 0x0060
/*
The Mixes (Note that some are duplicated for ease
of use.
*/
#define MIX_MASK 0x001F
#define MIX_NOT_DST 0x0000
#define MIX_0 0x0001
#define MIX_1 0x0002
#define MIX_DST 0x0003
#define MIX_LEAVE_ALONE 0x0003
#define MIX_NOT_SRC 0x0004
#define MIX_SRC_XOR_DST 0x0005
#define MIX_XOR 0x0005
#define MIX_NOT__SRC_XOR_DST 0x0006
#define MIX_XNOR 0x0006
#define MIX_SRC 0x0007
#define MIX_REPLACE 0x0007
#define MIX_PAINT 0x0007
#define MIX_NOT_SRC_OR_NOT_DST 0x0008
#define MIX_NAND 0x0008
#define MIX_NOT_SRC_OR_DST 0x0009
#define MIX_SRC_OR_NOT_DST 0x000A
#define MIX_SRC_OR_DST 0x000B
#define MIX_OR 0x000B
#define MIX_SRC_AND_DST 0x000C
#define MIX_AND 0x000C
#define MIX_SRC_AND_NOT_DST 0x000D
#define MIX_NOT_SRC_AND_DST 0x000E
#define MIX_NOT_SRC_AND_NOT_DST 0x000F
#define MIX_NOR 0x000F
#define MIX_MIN 0x0010
#define MIX_DST_MINUS_SRC 0x0011
#define MIX_SRC_MINUS_DST 0x0012
#define MIX_PLUS 0x0013
#define MIX_MAX 0x0014
#define MIX_HALF__DST_MINUS_SRC 0x0015
#define MIX_HALF__SRC_MINUS_DST 0x0016
#define MIX_AVERAGE 0x0017
#define MIX_DST_MINUS_SRC_SAT 0x0018
#define MIX_SRC_MINUS_DST_SAT 0x001A
#define MIX_PLUS_SAT 0x001B
#define MIX_HALF__DST_MINUS_SRC_SAT 0x001C
#define MIX_HALF__SRC_MINUS_DST_SAT 0x001E
#define MIX_AVERAGE_SAT 0x001F
/* Memory Control Register */
#define BUFSWP 0x0010
#define VRTCFG_2 0x0000
#define VRTCFG_4 0x0004
#define VRTCFG_6 0x0008
#define VRTCFG_8 0x000C
#define HORCFG_4 0x0000
#define HORCFG_5 0x0001
#define HORCFG_8 0x0002
#define HORCFG_10 0x0003
/* Pixel Control Register */
#define MIXSEL_FRGDMIX 0x0000
#define MIXSEL_PATT 0x0040
#define MIXSEL_EXPPC 0x0080
#define MIXSEL_EXPBLT 0x00C0
#define COLCMPOP_F 0x0000
#define COLCMPOP_T 0x0008
#define COLCMPOP_GE 0x0010
#define COLCMPOP_LT 0x0018
#define COLCMPOP_NE 0x0020
#define COLCMPOP_EQ 0x0028
#define COLCMPOP_LE 0x0030
#define COLCMPOP_GT 0x0038
#define PLANEMODE 0x0004
/*
This makes it easier to use the palette.
*/
typedef struct {
unsigned char r;
unsigned char g;
unsigned char b;
} LUTENTRY;
/*
Macro to aid in waiting for the command queue to empty.
The parameter 'v' specifies the number of queue entries
that you are waiting to be free.
*/
#define WaitQueue(v) {while (inpw(GP_STAT) & (0x0100 >> (v)));}
#define WaitBusy() {while (inpw(GP_STAT) & GPBUSY); }
/*
* missing "in" and "out" stuff for various compilers
*/
#ifdef __TURBOC__
/*
* TCC has byte size "inp" and "outp"
*/
#pragma inline
#define outpw(port,value) do { \
_AX = (value); \
_DX = (port); \
asm out dx,ax; \
} while(0)
static int inpw(int port)
{
_DX = port;
asm in ax,dx;
return(_AX);
}
#endif /* __TURBOC__ */
#ifdef __GNUC__
/*
* gcc needs both byte and word size ones
*/
#define outp(port,value) do { \
asm volatile(" \n\
movl %1,%%eax \n\
movl %0,%%edx \n\
outb %%al,%%dx "\
: /* no output */ \
: "g" (port), "g" (value) \
: "ax", "dx" \
); \
} while(0)
#define outpw(port,value) do { \
asm volatile(" \n\
movl %1,%%eax \n\
movl %0,%%edx \n\
outw %%ax,%%dx "\
: /* no output */ \
: "g" (port), "g" (value) \
: "ax", "dx" \
); \
} while(0)
static inline int inp(int port)
{
register int value;
asm volatile(" \n\
movl %1,%%edx \n\
inb %%dx,%%al \n\
movzbl %%al,%0 "\
: "=g" (value) \
: "g" (port) \
: "ax", "dx" \
);
return(value);
}
static inline int inpw(int port)
{
register int value;
asm volatile(" \n\
movl %1,%%edx \n\
inw %%dx,%%ax \n\
movzwl %%ax,%0 "\
: "=g" (value) \
: "g" (port) \
: "ax", "dx" \
);
return(value);
}
#endif /* __GCC__ */